home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / LZSS Res 2.1 ト.sit / LZSS Res 2.1 ƒ / LZSS Example ƒ / LZSSExample.c next >
C/C++ Source or Header  |  1993-07-04  |  3KB  |  169 lines

  1. /*
  2.  * Copyright ゥ 1994 Dmitry Boldyrev
  3.  * All rights reserved
  4.  */
  5.  
  6. #include <Dialogs.h>
  7. #include <Events.h>
  8. #include <Fonts.h>
  9. #include <Memory.h>
  10. #include <Menus.h>
  11. #include <OSEvents.h>
  12. #include <QuickDraw.h>
  13. #include <Traps.h>
  14. #include <Palettes.h>
  15. #include "::LZSS Lib ト:LZSS-Lib.h"
  16.  
  17. RgnHandle gOldVisRgn;
  18.  
  19. static void HideMenuBar(GrafPtr grafPort)
  20. {
  21.     RgnHandle newVisRgn;
  22.     GrafPtr savePort;
  23.  
  24.     GetPort(&savePort);
  25.     SetPort(grafPort);
  26.  
  27.     gOldVisRgn = NewRgn();
  28.     CopyRgn(grafPort->visRgn, gOldVisRgn);
  29.  
  30.     newVisRgn = NewRgn();
  31.     RectRgn(newVisRgn, &grafPort->portRect);
  32.     CopyRgn(newVisRgn, grafPort->visRgn);
  33.     DisposeRgn(newVisRgn);
  34.  
  35.     SetPort(savePort);
  36. }
  37.  
  38. static void ShowMenuBar(GrafPtr grafPort)
  39. {
  40.     GrafPtr savePort;
  41.     RgnHandle junkRgn;
  42.  
  43.     GetPort(&savePort);
  44.     SetPort(grafPort);
  45.  
  46.     junkRgn = NewRgn();
  47.     CopyRgn(gOldVisRgn, junkRgn);
  48.     DiffRgn(grafPort->visRgn, junkRgn, junkRgn);
  49.  
  50.     FillRgn(junkRgn, black);
  51.     DisposeRgn(junkRgn);
  52.  
  53.     CopyRgn(gOldVisRgn, grafPort->visRgn);
  54.     DisposeRgn(gOldVisRgn);
  55.     gOldVisRgn = NULL;
  56.  
  57.     DrawMenuBar();
  58. }
  59.  
  60. static void HeapInit(long stack, short masters)
  61. {
  62.     SetApplLimit(GetApplLimit() - stack);
  63.     MaxApplZone();
  64.     while (masters-- > 0)
  65.         MoreMasters();
  66. }
  67.  
  68. static void InitToolBox(void)
  69. {
  70.     EventRecord event;
  71.     short i;
  72.     
  73.     InitGraf((Ptr) &qd.thePort);
  74.     InitFonts();
  75.     InitWindows();
  76.     InitMenus();
  77.     InitPalettes();
  78.     TEInit();
  79.     InitDialogs(NULL);
  80.     FlushEvents(everyEvent, 0);
  81.     InitCursor();
  82.  
  83.     for (i = 0; i < 4; i++)
  84.         EventAvail(everyEvent, &event);
  85. }
  86.  
  87. static void CenterRect(Rect srcRect, Rect* dstRect)
  88. {
  89.     short width = (dstRect->right - dstRect->left);
  90.     short height = (dstRect->bottom - dstRect->top);
  91.  
  92.     dstRect->left = srcRect.left + (((srcRect.right - srcRect.left) / 2) - (width / 2));
  93.     dstRect->top = srcRect.top + (((srcRect.bottom - srcRect.top) / 2) - (height / 2));
  94.     dstRect->right = dstRect->left + width;
  95.     dstRect->bottom = dstRect->top + height;
  96. }
  97.  
  98. // loadTime in ticks (1/60s)
  99. static void StatisticsMenu(Size pSize, long loadTime)
  100. {
  101.     DialogPtr        dlog;
  102.     short            itemHit;
  103.     Str255            pSizeStr, loadTimeStr;
  104.     
  105.     NumToString(pSize/1024, pSizeStr);
  106.     NumToString((loadTime * 1000) / 60, loadTimeStr);
  107.     
  108.     ParamText(pSizeStr, loadTimeStr, "¥p", "¥p");
  109.     dlog = GetNewDialog(128, nil, (WindowPtr)-1);
  110.     do {
  111.         ModalDialog(nil, &itemHit);
  112.     } while (itemHit != ok);
  113. }
  114.  
  115. static Boolean WaitKey()
  116. {
  117.     EventRecord        theEvent;
  118.  
  119.     GetNextEvent(everyEvent, &theEvent);
  120.     return (theEvent.what == keyDown);
  121. }
  122.  
  123. void main(void)
  124. {
  125.     PicHandle        pic;
  126.     Rect            r;
  127.     WindowPtr        theWindow;
  128.     PaletteHandle    hPalette;
  129.     long            loadTime;
  130.     Size            pictSize;
  131.     
  132.     HeapInit(0, 4);
  133.     InitToolBox();
  134.     InitLZSSRes();
  135.     
  136.     if ((hPalette = GetNewPalette(128)) == nil)        // Load new palette
  137.        ExitToShell();
  138.  
  139.     loadTime = TickCount();
  140.     if ((pic = GetPicture(128)) == nil)                // Picture resource not found!
  141.       ExitToShell();
  142.     loadTime = TickCount() - loadTime;
  143.     pictSize = GetHandleSize(pic);
  144.     
  145.     if ((theWindow = GetNewCWindow(128, nil, (WindowPtr)-1)) == nil)
  146.        ExitToShell();
  147.  
  148.     SizeWindow(theWindow, screenBits.bounds.right, screenBits.bounds.bottom, true);
  149.     MoveWindow(theWindow, 0, 0, false);
  150.     ShowWindow(theWindow);
  151.     
  152.     HideMenuBar(theWindow);
  153.     SetPort(theWindow);
  154.     FillRect(&theWindow->portRect, black);
  155.  
  156.     SetPalette(theWindow, hPalette, true);
  157.  
  158.     r = (*pic)->picFrame;
  159.     CenterRect(theWindow->portRect, &r);
  160.     DrawPicture(pic, &r);
  161.  
  162.     while (!WaitKey());
  163.     
  164.     ShowMenuBar(theWindow);
  165.     DisposeWindow(theWindow);
  166.     RestoreDeviceClut(nil);
  167.     StatisticsMenu(pictSize, loadTime);
  168.     ReleaseResource((Handle)pic);
  169. }